package service;

import utils.RButton;
import utils.TextBorderUtlis;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import static java.lang.System.exit;

/**
 * 利用Jframe定义用户界面
 */
public class UserPanel extends JFrame {
    //    用户要输入的参数
//    木杆长度
    private static int poleLength;
    //    蚂蚁数量
    private static int antCount;
    //    蚂蚁速度，初始为5
    private static int velocity = 5;
    //    五只蚂蚁的位置
    private static int[] positions;

    //    用户面板构造
    public void InitUserPanel() {
//        初始化页面样式
        setSize(750, 420);//设置窗口大小
        setLocationRelativeTo(null);//窗口居中
        setTitle("AntClimbGame");//设置标题
        JPanel imPanel = (JPanel) getContentPane();//内容面板必须强转为JPanel才可以实现下面的设置透明
        imPanel.setOpaque(false);//将内容面板设为透明
        ImageIcon icon = new ImageIcon("AntGame/src/main/resource/bg.png");//背景图
        JLabel label = new JLabel(icon);//往一个标签中加入图片
        label.setBounds(0, 0, getWidth(), getHeight());//设置标签位置大小，记得大小要和窗口一样大
        icon.setImage(icon.getImage().getScaledInstance(label.getWidth(), label.getHeight(), Image.SCALE_DEFAULT));//图片自适应标签大小
        getLayeredPane().add(label, Integer.valueOf(Integer.MIN_VALUE));//标签添加到层面板
//        流式布局，从左到右按顺序排列
        setLayout(new FlowLayout(FlowLayout.CENTER, 150, 20));
//        文本框圆角
        TextBorderUtlis Border = new TextBorderUtlis(new Color(80, 59, 178), 3, true);
//        界面文字和输入框
        JLabel labelLength = new JLabel("木杆长度");
        labelLength.setFont(new Font("Serif", Font.BOLD, 28));
//        输入框
        JTextField poleLengthText = new JTextField("300", 15);
        poleLengthText.setBorder(Border);
        poleLengthText.setFont(new Font(null, Font.PLAIN, 20));
        add(labelLength);
        add(poleLengthText);

        JLabel labelCount = new JLabel("蚂蚁数量");
        JTextField antCountText = new JTextField("5", 15);
        antCountText.setFont(new Font(null, Font.PLAIN, 20));
        antCountText.setBorder(Border);
        labelCount.setFont(new Font("Serif", Font.BOLD, 28));
        add(labelCount);
        add(antCountText);

        JLabel labelVelocity = new JLabel("蚂蚁速度");
        JTextField velocityText = new JTextField("5", 15);
        velocityText.setFont(new Font(null, Font.PLAIN, 20));
        velocityText.setBorder(Border);
        labelVelocity.setFont(new Font("Serif", Font.BOLD, 28));
        add(labelVelocity);
        add(velocityText);

        JLabel labelPos = new JLabel("初始位置");
        JTextField posText = new JTextField("30 80 110 160 250", 15);
        posText.setFont(new Font(null, Font.PLAIN, 20));
        posText.setBorder(Border);
        labelPos.setFont(new Font("Serif", Font.BOLD, 28));
        JButton button = new RButton("点击开始");
        button.setFont(new Font("仿宋", Font.BOLD, 28));
        add(labelPos);
        add(posText);
        add(button);

//        设置Jframe窗体可见
        setVisible(true);

//        监听Jframe窗体关闭事件
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
            }
        });

        // 点击开始
        button.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 读取用户输入的数据
                try {
                    poleLength = Integer.parseInt(poleLengthText.getText());
                    antCount = Integer.parseInt(antCountText.getText());
                    velocity = Integer.parseInt(velocityText.getText());
                    positions = stringToIntArr(posText.getText());
                } catch (Exception exception) {
                    JOptionPane.showMessageDialog(null,
                            "请输入合法整数！",
                            "警告",
                            JOptionPane.ERROR_MESSAGE);
                }
                Boolean flag1=checkPoleLength(poleLength);
                Boolean flag2=checkAntCount(antCount);
                Boolean flag3=checkVelocity(velocity);
                Boolean flag4=checkPositions(positions);
                if(flag1&&flag2&&flag3&&flag4){
                    setVisible(false);
                    CreepingGame game = new CreepingGame(poleLength, antCount, velocity, positions);//开始游戏
                    game.addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosed(WindowEvent e) {
                            super.windowClosed(e);
                            setVisible(true);
                        }
                    });
                }
            }
        });
    }


    /**
     * 将输入位置的string类型数组转化为int型数组
     * @param str
     * @return
     */
    private static int[] stringToIntArr(String str) {
        String[] arr = str.split("\\s+");
        int[] intArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            intArr[i] = Integer.parseInt(arr[i]);
        }

        return intArr;
    }

    /**
     * 校验柱子长度
     * @param poleLength
     * @return
     */
    private Boolean checkPoleLength(int poleLength) {
        if (poleLength >= 650 || poleLength <= 0) {
            JOptionPane.showMessageDialog(null,
                    "输入木杆长度不合法",
                    "错误",
                    JOptionPane.ERROR_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * 校验蚂蚁数量
     * @param antCount
     * @return
     */
    private Boolean checkAntCount(int antCount) {
        if (antCount <= 0 || antCount > 5) {
            JOptionPane.showMessageDialog(null,
                    "输入蚂蚁数量不合法",
                    "错误",
                    JOptionPane.ERROR_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * 校验速度
     * @param velocity
     * @return
     */
    private Boolean checkVelocity(int velocity) {
//        速度要能够整除木杆长度
        if (velocity <= 0 || velocity > poleLength || poleLength % velocity != 0) {
            JOptionPane.showMessageDialog(null,
                    "您输入的初始位置不合法，请确保初始位置能被蚂蚁速度整除且与蚂蚁数量匹配",
                    "错误",
                    JOptionPane.ERROR_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * 校验蚂蚁位置
     * @param positions
     * @return
     */
    private Boolean checkPositions(int[] positions) {
        if (positions.length != antCount){
            JOptionPane.showMessageDialog(null,
                    "您输入的初始位置不合法，请确保初始位置能被蚂蚁速度整除且与蚂蚁数量匹配",
                    "错误",
                    JOptionPane.ERROR_MESSAGE);
            return false;
        }
        for (int i = 0; i != positions.length; i++) {
//            速度要能够整除每只蚂蚁的位置，否则报错,并且位置不能超出木杆长度范围
            if (positions[i] < 0 || positions[i] > poleLength || positions[i] % velocity != 0){
                JOptionPane.showMessageDialog(null,
                        "输入位置不合法，蚂蚁速度应能整除每个位置且位置个数=蚂蚁数量",
                        "错误",
                        JOptionPane.ERROR_MESSAGE);
                return false;
            }
        }
        return true;
    }
}
